package main

import (
	"fmt"
	"github.com/go-git/go-git/v5"
	"github.com/go-git/go-git/v5/plumbing"
	"log"
	"os"
)

func checkCommit() {
	// 本地git仓库的路径
	repoPath := dir

	// 打开本地已存在的git仓库
	repo, err := git.PlainOpen(repoPath)
	if err != nil {
		log.Fatal(err)
	}

	// 使用repo进行其他操作
	// 获取要对比的两个分支的引用
	branch1, branch2 := os.Args[1], os.Args[2]
	branch1 = fmt.Sprintf("refs/heads/%s", branch1)
	branch2 = fmt.Sprintf("refs/heads/%s", branch2)
	branch1Ref, err := repo.Reference(plumbing.ReferenceName(branch1), true)
	if err != nil {
		log.Fatal(err)
	}

	branch2Ref, err := repo.Reference(plumbing.ReferenceName(branch2), true)
	if err != nil {
		log.Fatal(err)
	}
	// 获取两个分支的提交对象
	branch1Commit, err := repo.CommitObject(branch1Ref.Hash())
	if err != nil {
		log.Fatal(err)
	}

	branch2Commit, err := repo.CommitObject(branch2Ref.Hash())
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(branch2Commit, branch1Commit)
	// 对比两个分支的代码差异
	patch, err := branch1Commit.Patch(branch2Commit)
	if err != nil {
		log.Fatal(err)
	}

	// 获取文件级别的差异
	files := patch.FilePatches()
	fmt.Println(files)
	if len(files) == 0 {
		fmt.Println("两个分支的代码一样")
		return
	}
	for _, file := range files {
		fmt.Printf("文件名：%s\n", file)
		fmt.Printf("差异：%v\n", file)
	}
}

func main() {
	err, checkStatus := checkHasGitFile()
	if !checkStatus && err != nil {
		fmt.Printf("遍历目录时发生错误: %v\n", err)
		return
	}
	if !checkStatus && err == nil {
		fmt.Println("该目录下检测不到.git文件")
		return
	}

	//查看提交
	checkCommit()

}
